﻿using System.Collections.Generic;
using MIAP.Entidades;

namespace MIAP.DataAccess.Interfaces
{
    /// <summary>
    /// Interface de operaciones básicas en base de datos para la entidad de proyecto.
    /// </summary>
    public interface IProyectosDao
    {
        /// <summary>
        /// Obtiene todos los Proyectos.
        /// </summary>
        /// <returns>Lista con todos los usuarios.</returns>
        IList<ProyectoInfo> GetProyectos();

        /// <summary>
        /// Obtiene todos los Proyectos que cumplan con el nombre y o estatus.
        /// </summary>
        /// <param name="nombreProyecto">Nombre del proyecto por el cual filtraremos (comando contain) mandar null si no se requiere búsqueda por este campo.</param>
        /// <param name="estatusActivo">True (Activo), False (Inactivo) mandar null si no se requiere este campo.</param>
        /// <returns>Lista con los usuarios con el filtro realizado</returns>
        IList<ProyectoInfo> GetProyectos(string nombreProyecto, bool? estatusActivo);

        /// <summary>
        /// Cambia el estatus del proyecto a activo o inactivo.
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto del cual se cambiará el estatus.</param>
        /// <param name="estatusRegistro">True (Activo), False (Inactivo)</param>
        void ChangeEstatusProyecto(int idProyecto, bool estatusRegistro);

        /// <summary>
        /// Obtiene la información de un determinado proyecto.
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto del que se desea obtener la informacion.</param>
        /// <returns>Información general del usuario.</returns>
        ProyectoInfo GetProyectoById(int idProyecto);

        /// <summary>
        /// Agrega un nuevo proyecto.
        /// </summary>
        /// <param name="proyecto">Es el proyecto que será agregado.</param>
        /// <param name="user">Usuario que esta agregando la información.</param>
        void AddNewProyecto(ProyectoInfo proyecto, string user);

        /// <summary>
        /// Modifica la información de un proyecto .
        /// </summary>
        /// <param name="proyecto">Es el proyecto al que se le modificará la información.</param>
        /// <param name="user">Es el usuario que esta modificando la información.</param>
        void EditProyecto(ProyectoInfo proyecto, string user);

        /// <summary>
        /// Obtiene el id y la descripción de todos los proyectos.
        /// </summary>
        /// <returns>Lista con ids y descripciones de todos los proyectos.</returns>
        IList<CatalogoInfo> GetCatalogProyecto();

        /// <summary>
        /// Verifica la existencia del proyecto.
        /// </summary>
        /// <param name="nombreProyecto">Nombre del proyecto que se desea agregar.</param>
        /// <returns>Indicador de si el proyecto existe o no.</returns>
        bool VerifyExistProyecto(string nombreProyecto);
    }
}
